"""as_completed方法的使用concurrent.futures.as_completed（fs，timeout = None ）：

返回由fs给出的Future实例的迭代器，yield future实例（当它们完成或取消），当调用__next__()不能获得结果（在timeout时间后）时，会抛出异常concurrent.futures.TimeoutError

注意：是无序的，谁先完成就先yield谁，从下面运行的结果可以看出。
"""
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests


def thread_run(url):
    try:
        re = requests.get(url=url, timeout=30)
        re.raise_for_status()
        re.encoding = re.apparent_encoding
        return re.text
    except:
        return


if __name__ == "__main__":
    executor = ThreadPoolExecutor(max_workers=10)
    urls = [
        "https://blog.csdn.net/weixin_41599977/article/details/92404112",
        "https://blog.csdn.net/weixin_41599977/article/details/91048654",
        "https://blog.csdn.net/weixin_41599977/article/details/90300773"
    ]
    futures_2_url = {executor.submit(thread_run, url): url for url in urls}  # 字典表达式

    # as_complete方法是一个生成器，在没有任务完成时，会堵塞，当有某个任务完成的时候，
    # 就会yield这个任务，所以就能执行for循环下面的语句，然后继续堵塞
    for future in as_completed(futures_2_url):
        data = future.result()
        print("In the main thread: get page {} success, {} bytes.".format(futures_2_url[future], len(data)))

